home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / djgpp / libsrc / c / bios / biosdisk.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-07-16  |  2.0 KB  |  106 lines

  1. #include <bios.h>
  2. #include <go32.h>
  3. #include <dpmi.h>
  4. #include <stdlib.h>
  5.  
  6. #define tb _go32_info_block.linear_address_of_transfer_buffer
  7.  
  8. static int dos_segment = 0;
  9. static _go32_dpmi_seginfo dos_info;
  10.  
  11. static void free_dos_buffer()
  12. {
  13.   _go32_dpmi_free_dos_memory(&dos_info);
  14.   dos_segment = 0;
  15. }
  16.  
  17. static void alloc_dos_buffer()
  18. {
  19.   if (dos_segment)
  20.     return;
  21.   dos_info.size = 18 * 512 / 16;
  22.   if (_go32_dpmi_allocate_dos_memory(&dos_info))
  23.   {
  24.     dos_segment = 0;
  25.     return;
  26.   }
  27.   dos_segment = dos_info.rm_segment;
  28.   atexit(free_dos_buffer);
  29. }
  30.  
  31. int biosdisk(int cmd, int drive, int head, int track,
  32.          int sector, int nsects, void *buffer)
  33. {
  34.   int seg, ofs, xfer=0, before=0;
  35.   _go32_dpmi_registers r;
  36.   switch (cmd)
  37.   {
  38.   case 2:
  39.     xfer = 512 * nsects;
  40.     before = 0;
  41.     break;
  42.   case 3:
  43.     xfer = 512 * nsects;
  44.     before = 1;
  45.     break;
  46.   case 5:
  47.     xfer = 2 * 256;
  48.     before = 1;
  49.     break;
  50.   case 0x0a:
  51.     xfer = (512+7) * nsects;
  52.     before = 0;
  53.     break;
  54.   case 0x0b:
  55.     xfer = (512+7) * nsects;
  56.     before = 1;
  57.     break;
  58.   case 0x0e:
  59.     xfer = 512;
  60.     before = 0;
  61.     break;
  62.   case 0x0f:
  63.     xfer = 512;
  64.     before = 1;
  65.     break;
  66.   }
  67.   if (xfer)
  68.   {
  69.     if (xfer > 18*512)
  70.       return 1;            /* bad command */
  71.     if (xfer > _go32_info_block.size_of_transfer_buffer)
  72.     {
  73.       alloc_dos_buffer();
  74.       if (dos_segment == 0)
  75.     return 0xbb;        /* undefined error */
  76.       seg = dos_segment;
  77.       ofs = 0;
  78.     }
  79.     else
  80.     {
  81.       seg = tb >> 4;
  82.       ofs = tb & 15;
  83.     }
  84.   }
  85.   memset(&r, 0, sizeof(r));
  86.   r.h.ah = cmd;
  87.   r.h.al = nsects;
  88.   r.x.es = seg;
  89.   r.x.bx = ofs;
  90.   r.h.ch = track & 0xff;
  91.   r.h.cl = sector | ((track >> 2) & 0xc0);
  92.   r.h.dh = head;
  93.   r.h.dl = drive;
  94.   if (xfer && before)
  95.     dosmemput(buffer, xfer, seg*16+ofs);
  96.   _go32_dpmi_simulate_int(0x13, &r);
  97.   if (xfer && !before)
  98.     dosmemget(seg*16+ofs, xfer, buffer);
  99.   if (cmd == 0x08)
  100.   {
  101.     ((short *)buffer)[0] = r.x.cx;
  102.     ((short *)buffer)[1] = r.x.dx;
  103.   }
  104.   return r.h.ah;
  105. }
  106.